Hardware:MT6737
DeviceOS:Android6.0
Kernel: Linux3.18
HostOS: Ubuntu16.04
[TOC]
预置 APP
1 | commit f99f8c8092e65cbadf138c9e6b55fb9f22160425 |
参考 https://blog.csdn.net/long375577908/article/details/78270702
查看所有的输入法的包名
代码内进行如下修改1
2
3
4
5
6
7
8
9
10--- a/base/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/base/services/core/java/com/android/server/InputMethodManagerService.java
@@ -3037,6 +3037,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
}
if (DEBUG) Slog.d(TAG, "Checking " + compName);
+ Slog.d(TAG, "Checking packageName:" + si.packageName + " name:" + si.name);
try {
InputMethodInfo p = new InputMethodInfo(mContext, ri, additionalSubtypes);
开机阶段1
adb logcat | grep "Checking "
可以看到内置的所有输入法的名字
查看 Setting 中我们需要写入的值
在设置的 语言和输入法 界面点击切换输入法.
会出现如下 Log1
2
3
4adb logcat | grep SettingsProvider
05-10 11:52:58.431 891 909 V SettingsProvider: packageValueForCallResult, name = default_input_method, value : com.cootek.smartinputv5/com.cootek.smartinput5.TouchPalIME
05-10 11:52:58.445 891 891 V SettingsProvider: packageValueForCallResult, name = enabled_input_methods, value : com.android.inputmethod.latin/.LatinIME:com.cootek.smartinputv5/com.cootek.smartinput5.TouchPalIME
所以我们知道了我们需要去操作的值是default_input_method
和 enabled_input_methods
在代码中写入 Setting 的值
1 | --- a/base/packages/SettingsProvider/res/values/defaults.xml |
这里不同版本的 Android 可能 loadStringSetting 的实现不一样.
可以自己看下 loadStringSetting 的实现然后传参.
补充:MTK平台FAQ汇总
如果按照如上的步骤没有修改成功,请参考如下步骤进行检查修改:
(1)检查是否成功预置输入法:FAQ13232
(2)检查下setting– language&input 界面,该输入法前面的勾是否选上,没有选上说明此输入法没有被enable,请参考FAQ08909来enable;
(3)检查是否发生语言切换,如果有切换则会恢复默认输入法,若不想因语言变化导致恢复,请参考FAQ12213,FAQ06663
(4)修改默认输入法FAQ04327
06663
【描述】切换系统语言后默认输入法会自动切换到latin输入法,或者系统预置的默认输入法不能生效【解法】
KK、L、M 的解决方案:
可以在文件inputmethodmanagerservice.java中
在构造函数InputMethodManagerService中的最后面,将接收语言改变广播的事件注释掉:1
2
3
4
5
6
7
8
9
10final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_LOCALE_CHANGED);
mContext.registerReceiver( new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
synchronized(mMethodMap) {
//resetStateIfCurrentLocaleChangedLocked();//将此行注释掉
}
}
}, filter);
这样就可以了。
12213
[DESCRIPTION]
一些版本设置默认输入法不成功,是因为KK比较晚的版本和之后的版本把默认输入法的代码搬到了InputMethodManagerService.java中。
[SOLUTION]
首先查看InputMethodManagerService.java中的systemRunning函数中是否有下面红色的代码,如果有则把红色后面蓝色的语句注释掉即可。
如果没有红色代码可以参考FAQ06663。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27if (!mImeSelectedOnBoot) {
Slog.w(TAG, "Reset the default IME as \"Resource\" is ready here.");
/// M: Loading preinstalled ime from feature option. @{
String preInstalledImeName = IMEFeatureOption.DEFAULT_INPUT_METHOD;
Slog.i(TAG, "IMEFeatureOption defaultIME : " + preInstalledImeName);
if (preInstalledImeName != null) {
InputMethodInfo preInstalledImi = null;
for (InputMethodInfo imi : mMethodList) {
Slog.i(TAG, "mMethodList service info : " + imi.getServiceName());
if (preInstalledImeName.equals(imi.getServiceName())) {
preInstalledImi = imi;
break;
}
}
if (preInstalledImi != null) {
setInputMethodLocked(preInstalledImi.getId(), NOT_A_SUBTYPE_ID);
} else {
Slog.w(TAG, "Set preinstall ime as default fail.");
resetDefaultImeLocked(mContext);
}
}
/// @}
resetStateIfCurrentLocaleChangedLocked();
InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(
mContext.getPackageManager(),
mSettings.getEnabledInputMethodListLocked());
}